import tools from '@/tools'

/**
 * @description 校验数据类型
 * @author 赵致喜
 * @date 2020-04-14 08:57:06
 * @version V1.0.0
 */

/**
 * @functionName dataTypeValidation
 * @param {*} value 被检测数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 校验全部数据类型
 * @author 赵致喜
 * @date 2020-04-14 08:47:16
 * @version V1.0.0
 */

export const dataTypeValidation = (value = '', type = 'String') => {
  const strType = tools.getRawType(value)
  if (strType === 'String') {
    return stringValidation(value, type)
  }
  if (strType === 'Number') {
    return numberValidation(value, type)
  }
  if (strType === 'Object') {
    return objectValidation(value, type)
  }
  if (strType === 'Array') {
    return arrayValidation(value, type)
  }
  if (strType === 'Boolean') {
    return arrayValidation(value, type)
  }
  if (strType === 'Function') {
    return arrayValidation(value, type)
  }
}

/**
* @functionName isValueType
* @param {*} value 被检测数据
* @param {String} type 数据类型
* @return {Object} 返回结果对象
* @description 检测校验数据参数类型
* @author 赵致喜
* @date 2020-04-14 10:10:52
* @version V1.0.0
*/

const isValueType = (value, type) => {
  const valueType = tools.getRawType(value)
  const resultObj = tools.resultObj(
    { value, type },
    false,
    `参数"value"类型不正确，请传入[${type}]类型！`
  )
  if (valueType === type) {
    resultObj.result = true
    resultObj.message = '校验成功！'
    return resultObj
  }
  return resultObj
}

/**
* @functionName isNumberType
* @param {String} type 数据类型
* @return {Object} 返回结果对象
* @description 检测校验数据参数类型
* @author 赵致喜
* @date 2020-04-14 10:13:52
* @version V1.0.0
*/

const isType = (type) => {
  const strtype = tools.getRawType(type)
  const resultObj = tools.resultObj(
    { type },
    false,
    '参数"type"类型不正确，请传入[String]类型！'
  )
  if (strtype === 'String') {
    resultObj.result = true
    resultObj.message = '校验成功！'
    return resultObj
  }
  return resultObj
}

/**
* @functionName compareData
* @param {*} value 被检测数据
* @param {String} type 数据类型
* @return {Object} 返回结果对象
* @description 对传入参数与类型进行比较
* @author 赵致喜
* @date 2020-04-13 14:03:52
* @version V1.0.0
*/

const compareData = (value, type) => {
  const strtype = isType(type)
  const valueType = isValueType(value, type)
  if (!strtype.result) return strtype
  if (!valueType.result) return valueType
  const resultObj = tools.resultObj(
    { value, type },
    false,
    `参数"value"类型与${type}类型不同，请输入正确的${type}类型！`
  )
  if (valueType.result && strtype.result) {
    if (valueType.parameters.type === type) {
      resultObj.result = true
      resultObj.message = '校验成功！'
      return resultObj
    }
  }
  return resultObj
}

/**
 * @functionName stringValidation
 * @param {String} value 被检测数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 校验是否为String类型
 * @author 赵致喜
 * @date 2020-04-14 08:57:29
 * @version V1.0.0
 */

export const stringValidation = (value = '', type = 'String') => {
  return compareData(value, type)
}

/**
 * @functionName numberValidation
 * @param {Number} value 被检测数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 校验是否为Number类型
 * @author 赵致喜
 * @date 2020-04-14 11:35:29
 * @version V1.0.0
 */

export const numberValidation = (value = 0, type = 'Number') => {
  return compareData(value, type)
}

/**
 * @functionName objectValidation
 * @param {Object} value 被检测数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 校验是否为Object类型
 * @author 赵致喜
 * @date 2020-04-14 11:40:29
 * @version V1.0.0
 */

export const objectValidation = (value = {}, type = 'Object') => {
  return compareData(value, type)
}

/**
 * @functionName arrayValidation
 * @param {Array} value 被检测数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 校验是否为Object类型
 * @author 赵致喜
 * @date 2020-04-14 11:45:29
 * @version V1.0.0
 */

export const arrayValidation = (value = [], type = 'Array') => {
  return compareData(value, type)
}

/**
 * @functionName booleanValidation
 * @param {Boolean} value 被检测数据
 * @return {Object} 返回结果对象
 * @description 校验是否为Object类型
 * @author 赵致喜
 * @date 2020-04-14 11:48:29
 * @version V1.0.0
 */

export const booleanValidation = (value = false, type = 'Boolean') => {
  return compareData(value, type)
}

/**
 * @functionName functionValidation
 * @param {Function} value 被检测数据
 * @return {Object} 返回结果对象
 * @description 校验是否为Object类型
 * @author 赵致喜
 * @date 2020-04-14 11:50:29
 * @version V1.0.0
 */

export const functionValidation = (value = function () { }, type = 'Function') => {
  return compareData(value, type)
}
